<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
/**
 * xml操作
 *
 */
class Xmllib {
	var $whole_xml;
	private $dom;
	private $xml_appshare;
	//private $tmp;
	function __construct()
	{
		$this->dom = new DomDocument('1.0', 'UTF-8');
		$this->xml_appshare = $this->dom->createElement('xml_appshare');
		$this->dom->appendChild($this->xml_appshare);
	}
	
	/**
	 * 根据用户传递的有结构的数组生成格式匹配的xml
	 *
	 * @param unknown_type $data
	 * @return unknown
	 */
	function _get_xml($data, $xml_fileds=array(), $top_tag='')
	{//print_r($data);
		foreach ($data as $key=>$value){
			//对添加的 xml_obj 元素不做处理
			if (in_array((string)$key, array('xml_obj', 'dim_current'))) {
				continue;
			}
			$new_key = is_numeric($key) && count($xml_fileds)>0 ? $xml_fileds[$data['dim_current']] : $key; 

			$tmp_xml = $this->dom->createElement($new_key);
			if(!isset($data['xml_obj']) && !isset($data[$key]['xml_obj'])){
				//递归初始条件
				if ($top_tag) {
					$xml_top_tag = $this->dom->createElement($top_tag);
					$this->xml_appshare->appendChild($xml_top_tag);
					is_array($value) ? $data[$key]['xml_obj'] = $xml_top_tag : null;
					$data['xml_obj'] = $xml_top_tag;
				}else{
					is_array($value) ? $data[$key]['xml_obj'] = $this->xml_appshare : null;
					$data['xml_obj'] = $this->xml_appshare;
				}
			}
			//如果是数组的话，在数组中添加子元素 xml_obj 为当前的 DomElement.
			if (is_array($value)) {
				isset($value['xml_obj']) || $value['xml_obj'] = $tmp_xml;
				$data['xml_obj']->appendChild($tmp_xml);
				$data[$key]['xml_obj'] = $tmp_xml;
				$this->get_xml($value, $xml_fileds);
			}else{
				isset($data['xml_obj']) || $data['xml_obj'] = $this->xml_appshare;
				$txt_node = $this->dom->createTextNode($value);
				$tmp_xml->appendChild($txt_node);
				$data['xml_obj']->appendChild($tmp_xml);
			}
			unset($tmp_xml);//释放
		}

		return $this->whole_xml = $this->dom->saveXML();
	}
	
	/**
	 * 获取最终的 xml， 添加了一层包装，对输入数组进行了处理
	 *
	 * @param unknown_type $data		需要生成xml的数组
	 * @param unknown_type $xml_fileds  各项子标签，将数字索引依次替换成数组中的标签
	 * @param unknown_type $top_tag     顶级标签
	 */
	function get_xml($data, $xml_fileds=array(), $top_tag='')
	{
		$this->array_dim($data);
		return $this->_get_xml($data, $xml_fileds, $top_tag);
	}
	
	/**
	 * 空结果集的返回
	 *
	 * @return unknown
	 */
	function empty_xml()
	{
		return $this->dom->saveXML();
	}
	
	/**
	 * 操作成功时返回的提示信息
	 *
	 * @param unknown_type $msg
	 * @return unknown
	 */
	function success_xml($msg)
	{
		return $this->_error_xml(0, $msg);
	}
	
	/**
	 * 出错失败时的提示信息
	 *
	 * @param unknown_type $msg
	 * @return unknown
	 */
	function error_xml($msg='error')
	{
		return $this->_error_xml(1, $msg);
	}
	
	/**
	 * 设置提示返回信息 （成功或失败的提示）
	 *
	 * @param unknown_type $n
	 * @param unknown_type $msg
	 */
	function _error_xml($n=0, $msg='ok')
	{
		$error = $this->dom->createElement('error');
		$this->xml_appshare->appendChild($error);
		//代号节点 1代表有错误 0代表成功
		$no = $this->dom->createElement('no');
		$no_txt = $this->dom->createTextNode($n);
		$no->appendChild($no_txt);
		//提示信息节点
		$message = $this->dom->createElement('message');
		$message_txt = $this->dom->createTextNode($msg);
		$message->appendChild($message_txt);
		//将$no, $message 添加到$error 上
		$error->appendChild($no);
		$error->appendChild($message);
		return $this->dom->saveXML();
	}
	
	/**
	 * 追加xml (添加到xml_appshare下)
	 *
	 * @param unknown_type $tag
	 * @param unknown_type $value
	 */
	function append_xml($tag='', $text='')
	{
		$append_tag = $this->dom->createElement($tag);
		$tag_txt = $this->dom->createTextNode($text);
		$append_tag->appendChild($tag_txt);
		$this->xml_appshare->appendChild($append_tag);
	}
	
	
	/**
	 * 设置数组每级维度，供生成xml调用
	 *
	 * @param unknown_type $arr
	 * @return unknown
	 */
	function array_dim(&$arr)
	{
		//遍历当前数组
		foreach ($arr as $k=>$v){
			//如果是数字索引的数组，则记录索引维度
			if(is_numeric($k) && is_array($v)){
				//如果不存在上级dim_current记录，则设置顶级dim_current为0，当前级为第一级
				isset($arr['dim_current']) ? null : $arr['dim_current'] = 0;
				//当前级的dim_current为上级的 +1
				$arr[$k]['dim_current'] = $arr['dim_current'] + 1 ;
				//递归
				$this->array_dim($arr[$k]);
			}
		}
		return $arr;
	}
}